class Facture < Charge

  has_many :putofactures
  has_many :pulves, :through => :putofactures
  
  has_many :labtofactures
  has_many :labours, :through => :labtofactures
  
  has_many :factoparcelles, :single_save => true, :dependent => :destroy
  has_many :parcelles, :through => :factoparcelles

  belongs_to :category
  belongs_to :factype
  belongs_to :user
  
  validates_presence_of :name
  validates_presence_of :cout
  validates_presence_of :category
  validates_presence_of :user
  validates_associated :factoparcelles
#  validates_associated :labtofactures

# METHODES

  def diff?
    return (self.factype.name == 'diff')  
  end
  
  #somme les contribition des labour d'une parcelle
  #c'est-a-dire les champs 'value' des labtofactures associés 
  def sum_labours
    Labtofacture.sum(:value, :conditions => ['facture_id = ?', self.id])
  end
  
  def sum_pulves
    Putofacture.sum(:value, :conditions => ['facture_id = ?', self.id])
  end
  
  def sum_charges
    return (self.sum_pulves + sum_labours)
  end
  
  def get_cout_ha
    return (self.get_cout_total / self.sum_surfaces)  
  end
  
  # retourne le cout total de cette charge
  def get_cout_total
    if (self.diff?)
      return (self.cout - self.sum_charges)
    else
      return (self.cout)
    end
  end

  # retourne le cout ha par parcelle
  # cette méthode sera différenciée de get_cout_ha lorsque les indices 
  # de chaque parcelle seront introduits  
  def get_cout_ha_parcelle(parcelle)
    cout_ha_parcelle = 0
    if (all_parcelles? || self.parcelles.include?(parcelle))
      cout_ha_parcelle = self.get_cout_ha
    end
    return cout_ha_parcelle
  end
  
  def get_cout_ha_zone(zone)
    cout_ha_zone = 0
    if (all_parcelles? || self.include_zone?(zone))
      cout_ha_zone = self.get_cout_ha
    end
    return cout_ha_zone
  end
  
  def get_cout_ha_parcelle_with_rate(parcelle)
    cout_ha_parcelle = 0
    if all_parcelles? 
      cout_ha_parcelle = self.get_cout_ha
    end
    if (self.parcelles.include?(parcelle))
    rate = Factoparcelle.find_by_parcelle(parcelle.id, self.id).rate
      cout_ha_parcelle = self.get_cout_ha * rate
    end
    return cout_ha_parcelle
  end
  
  

#debut Factoparcelle
  def new_factoparcelle_attributes=(factoparcelle_attributes)
    factoparcelle_attributes.each do |attributes|
      factoparcelles.build(attributes)
    end
  end
 
  def existing_factoparcelle_attributes=(factoparcelle_attributes)
    factoparcelles.reject(&:new_record?).each do |factoparcelle|
      attributes = factoparcelle_attributes[factoparcelle.id.to_s]
      if attributes
        factoparcelle.attributes = attributes
      else
#        factoparcelle.delete(factoparcelle)
        sql = "DELETE FROM factoparcelles WHERE id = #{factoparcelle.id} LIMIT 1"
        ActiveRecord::Base.connection.execute(sql)
      end
    end
  end
 
  def save_factoparcelles
    factoparcelles.each do |factoparcelle|
      factoparcelle.save(false)
    end
  end
#fin Factoparcelle  

end